Exponential Backoff
失敗回数が多くなるほどに再実行の間隔が指数関数的に広くする 無駄な再実行を抑える
リトライ期間を徐々に長くする
code:_
1秒 → 1秒 → 2秒 → 5秒 → 9秒 → 17秒 → 34秒 …
GPT-4.icon
✅ 指数バックオフを使う理由
1. サーバの負荷軽減
即座にリトライし続けると、すでに過負荷なサーバにさらに負荷をかけてしまいます。
時間を空けることで、回復の余地を与えます。
2. ネットワークの安定化
ネットワークの一時的な不安定さによるエラーもあるため、待つことで回避できることがあります。
3. 無限リトライの抑制
多くの場合、最大リトライ回数を設けて、無限ループも避けています
実装例
code:ts
// 例: Exponential backoff with jitter
const baseDelay = 1000; // 1秒
const maxAttempts = 10;
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
const response = await fetchApi();
return response;
} catch (err) {
const delay = Math.min(baseDelay * 2 ** (attempt - 1), 60000);
const jitter = delay * (0.5 + Math.random() * 0.5);
console.log(Retrying in ${Math.round(jitter)}ms);
await new Promise(resolve => setTimeout(resolve, jitter));
}
}